package com.example.emos.wx.service.impl;

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.example.emos.wx.db.dao.TbUserDao;
import com.example.emos.wx.db.pojo.TbUser;
import com.example.emos.wx.exception.EmosException;
import com.example.emos.wx.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.Set;

/**
 * @ClassName : UserServiceImpl
 * @Author : 骆发茂
 * @Date: 2021/10/12 20:19
 * @Description :
 */

@Service
@Slf4j
@Scope("prototype")
public class UserServiceImpl implements UserService {

    @Value("${wx.app-id}")
    private String appId;

    @Value("${wx.app-secret}")
    private String appSecret;

    @Autowired
    private TbUserDao userDao;

    private TbUserDao tbUserDao;


    /**
     * 通过传来的临时授权字符换code,向url的地址即微信小程序中获取openid,发送的变量中有appid,appsecret,code,
     * 从微信小程序端获取到code临时字符串，从code临时字符串中获取openid的值。
     * appid,appsecret相当于账号密码
     * **code就是发送过去给微信,让微信返回openid回来
     * **
     */

    private String getOpenId(String code/**临时授权字符换code*/) {
        String url = "https://api.weixin.qq.com/sns/jscode2session";
        HashMap map = new HashMap();
        /*定义发送的变量*/
        map.put("appid", appId);
        map.put("secret", appSecret);
        map.put("js_code", code);
        map.put("grant_type", "authorization_code");

        /*确定的，固定的*/
        map.put("grant_type", "authorization_code");

        /*利用hutool工具类中的HttpUtil发送url和map变量请求到微信中*/
        String response = HttpUtil.post(url, map);

        /*将获得的数据转化成json格式*/
        /*从string转换成json*/
        JSONObject json = JSONUtil.parseObj(response);
        /*从json格式中获取openid*/
        String openId = json.getStr("openid");
        /*判断openid*/
        if (openId == null || openId.length() == 0) {
            throw new RuntimeException("临时登陆凭证错误");
        }
        return openId;

    }

    @Override
    /**registerCode，激活码；code，临时授权字符串;
     * openid；nickname，昵称；
     * photo，头像*/
    public int registerUser(String registerCode, String code, String nickname, String photo) {
        /*填入的注册码是超级管理员邀请码,判断数据库中有没有信息*/
        if (registerCode.equals("000000")) {
            /*查询超级管理员账户是否已经绑定*/
            boolean bool = userDao.haveRootUser();
            /**如果数据库中不存在,则填入,用code，临时授权字符串查找openid,
             * 上面定义的方法private String getOpenId(String code)查找openid*/
            if (!bool) {
                /*把当前用户绑定到root账户中*/
                String openId = getOpenId(code);
                /*把当前用户绑定到root账户中,通过*/
                /*当不存在超级管理员的情况时候，添加信息*/
                HashMap param = new HashMap();
                param.put("openId", openId);
                param.put("nickname", nickname);
                param.put("photo", photo);
                param.put("role", "[0]");
                param.put("status", 1);
                param.put("createTime", new Date());
                param.put("root", true);
                userDao.insert(param);
                /*通过微信发来的openid,从数据库中查找id*/
                int id = userDao.searchIdByOpenId(openId);
                return id;

            }
            /*数据库中存在,则抛出异常*/
            else {
                throw new EmosException("无法绑定超级管理员账号");

            }

        }
        /*填入的不是000000超级管理员邀请码,则是普通用户的邀请码输入*/
        else {
            /**普通员工的注册*/

        }
        return 0;

    }


    /*底层查询到的权限，返回Set<String>，set表表示不重复显示，String里面是权限具体信息*/
    @Override
    public Set<String> searchUserPermissions(int userId) {
        Set<String> permissions = userDao.searchUserPermissons(userId);
        return permissions;
    }


    /**
     * 我们可以这样设计，用户在Emos登陆页面点击登陆按钮，
     * 然后小程序把临时授权字符串，提交给后端Java系统。
     * 后端Java系统拿着临时授权字符串换取到openid，
     * 我们查询用户表中是否存在这个openid，如果存在，
     * 意味着该用户是已注册用户，可以登录。如果不存在，说明该用户尚未注册，
     * 目前还不是我们的员工，所以禁止登录，
     */
    /**
     * 通过临时字符串查找openid，然后查询数据库中是否存在该openid
     * @param code
     * @return
     */
    @Override
    public Integer login(String code) {
        String openId = getOpenId(code);
        Integer id = userDao.searchIdByOpenId(openId);
        if (id == null) {
            throw new EmosException("账户不存在！");
        }
        return id;
    }

    @Override
    public TbUser searchById(int userId) {
        TbUser user = userDao.searchById(userId);
        return user;

    }

    @Override
    public String searchUserHiredate(int userId) {
        String hiredate = userDao.searchUserHiredate(userId);
        return hiredate;
    }


    /** 8-11实现用户页面数据加载(13-54)
     移动端：我的栏目，前端需要显示用户名，部门情况、头像*/
    @Override
    public HashMap searchUserSummary(int userId) {
        HashMap map = userDao.searchUserSummary(userId);
        return map;
    }
}